﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Net;
using System.Text;
using Sio.Mdm.BF.Administracija;
using Sio.Mdm.BL.Base;
using Sio.Mdm.Entities;
using Sio.Mdm.Server;
using Sio.Mdm.Types;
using Sio.Mdm.Types.Database;
using Sio.Mdm.Client;
using System.Configuration;

namespace Sio.Mdm.BL.Administracija
{
  [Service(Name = "PozabljenoGesloService", DefaultInterface = typeof(IPozabljenoGesloService))]
  public class PozabljenoGesloService : BaseFirebird<PonastavitevGesla>, IPozabljenoGesloService
  {
    public PozabljenoGesloService()
            : base("IDM")
        {
        }
    //Pozabljeno geslo______________________________________________________________________________________
    public void Ponastavitev(int IdmStevilka, string email, string uporabniskoIme, string ime)
    {
      System.Guid guid = System.Guid.NewGuid();
      PonastavitevGesla ponastavitevGesla = EntityFactory.CreateInstance<PonastavitevGesla>();
      ponastavitevGesla.IdmStevilka = IdmStevilka;
      ponastavitevGesla.GUID = guid.ToString("N");

      var slService = ServiceFactory.GetService<IPonastavitevGeslaService>();
      slService.Create(ponastavitevGesla, null);

      System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();

      System.Net.NetworkCredential cred = new System.Net.NetworkCredential(
          ConfigurationSettings.AppSettings["MailAccount"], 
          ConfigurationSettings.AppSettings["MailPassword"]);

      mail.To.Add(email);
      mail.Subject = "Povezava za aktivacijo novega gesla";

      mail.From = new System.Net.Mail.MailAddress(ConfigurationSettings.AppSettings["AdminMail"]);
      mail.IsBodyHtml = true;
      mail.Body = "Pozdravljeni " + ime + ", <br>"
                    + "<br>"
                    + "Zahtevali ste resetiranje vašega gesla na spletni aplikaciji SIO.MDM, zato ker set pozabili geslo. Če tega niste zahtevali vi, prosimo ignorirajte to pošto. Bo potekla in postala neuporabna čez 24ur. <br>"
                    + "<br>"
                    + "Za resetiranje vašega gesla, prosimo obiščite naslednjo spletno povezavo: <br>"
                    + "<a href=http://localhost:64745/Login.aspx?guid=" + guid.ToString("N") + ">"
                    + "http://localhost:64745/Login.aspx?guid=" + guid.ToString("N") + "</a><br>"
                    + "<br>"
                    + "Ko boste obiskali povezavo, boste lahko nastavili novo geslo. <br>"
                    + "<br>"
                    + "Vaše uporabniško ime je: " + uporabniskoIme + " <br>"
                    + "<br>"
                    + "Za urejenje vašga profila, pojdite na naslednjo stran:<br>"
                    + "<a href=http://localhost:64745/Uporabnik/Default.aspx>http://localhost:64745/Uporabnik/Default.aspx></a> <br>"
                    + "<br>"
                    + "Lep pozdrav <br>"
                    + "Ekipa Sio.Mdm ";

      System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("smtp.gmail.com");
      smtp.UseDefaultCredentials = false;
      smtp.EnableSsl = true;
      smtp.Credentials = cred;
      smtp.Port = 587;
      smtp.Send(mail);
    }
    public Boolean PreveriEmail(string email, int organizacijaID)
    {
      UporabniskiRacun uporabniskiRacun = EntityFactory.LoadEntity<UporabniskiRacun>
        (new Filter<UporabniskiRacun>().Where(r => (r.OrganizacijaId == organizacijaID && r.EMail == email))
      );
      if (uporabniskiRacun.EntityState != EntityState.Error)
      {
        Ponastavitev(uporabniskiRacun.IdmStevilka, uporabniskiRacun.EMail, uporabniskiRacun.UporabniskoIme, uporabniskiRacun.Ime);
        return true;
      }
      else
        return false;
    }
    public Boolean PreveriUporabniskoIme(string uporabniskoIme, int organizacijaID)
    {
      UporabniskiRacun uporabniskiRacun = EntityFactory.LoadEntity<UporabniskiRacun>
        (new Filter<UporabniskiRacun>().Where(r => (r.OrganizacijaId == organizacijaID && r.UporabniskoIme == uporabniskoIme))
      );
      if (uporabniskiRacun.EntityState != EntityState.Error)
      {
        Ponastavitev(uporabniskiRacun.IdmStevilka, uporabniskiRacun.EMail, uporabniskiRacun.UporabniskoIme, uporabniskiRacun.Ime);
        return true;
      }
      else
        return false;
    }
    
    public Result PozabljenoGeslo(string uporabniskoIme, string email, int organizacijaId)
    {
      string napake = "";
      
      if (String.IsNullOrEmpty(uporabniskoIme) & String.IsNullOrEmpty(email))
        napake += "\r\n Vnesite uporabniško ime ali e-pošto.";
      else
      {
        if (!String.IsNullOrEmpty(email))
        {
          if (!PreveriEmail(email, organizacijaId))
            napake += "\r\n Ta e-pošta ne obstaja.";
        }else if (!String.IsNullOrEmpty(uporabniskoIme))
        {
          if (!PreveriUporabniskoIme(uporabniskoIme, organizacijaId))            
            napake += "\r\n To uporabniško ime ne obstaja.";
        }
      }     
      if (napake != "")
      {
        return new Result(String.Format(napake));
      }
      return null; 
    }
    //preverjanje, če je guid veljaven
    public Result PreveriGuid(string guid)
    {
      PonastavitevGesla ponastavitevGesla = EntityFactory.LoadEntity<PonastavitevGesla>
        (new Filter<PonastavitevGesla>().Where(r => (r.GUID == guid && r.DatumSpremembe == null))
      );
      if (ponastavitevGesla.EntityState != EntityState.Error)
      {
        DateTime val = DateTime.Now;
        int primerjava = DateTime.Compare(val,ponastavitevGesla.Datum);
        if ((val - ponastavitevGesla.Datum).TotalHours <= 24)
          return null;
        else
          return new Result("Identifikacijska koda je potekla."); ;
      }
      return new Result("Neveljavna identifikacijska koda.");
    }
    //spreminjanje pozabljenega gesla z novim geslom
    public Result PonastaviGeslo(string guid, string novoGeslo, string potrdiGeslo, string IpSpremembe)
    {
      if (String.IsNullOrEmpty(novoGeslo) & String.IsNullOrEmpty(potrdiGeslo))
      {
        return new Result("Vnesite gesli.");
      }
      else if (novoGeslo != potrdiGeslo)
      {
        return new Result("Gesli se ne ujemata.");
      }
      else
      {
        int IdmStevilka = 0;
        PonastavitevGesla ponastavitevGesla = EntityFactory.LoadEntity<PonastavitevGesla>
          (new Filter<PonastavitevGesla>().Where(r => (r.GUID == guid)).OrderBy(r => r.Datum)
        );
        if (ponastavitevGesla.EntityState != EntityState.Error)
        {
          IdmStevilka = ponastavitevGesla.IdmStevilka;
        }

        UporabniskiRacun uporabniskiRacun = EntityFactory.LoadEntity<UporabniskiRacun>
          (new Filter<UporabniskiRacun>().Where(r => (r.IdmStevilka == IdmStevilka))
        );
        if (uporabniskiRacun.EntityState != EntityState.Error)
        {
          
          var auth = ServiceFactory.GetService<IAvtorizacijaService>();
          auth.EncryptPassword(ref novoGeslo);
          uporabniskiRacun.Geslo = novoGeslo;
          uporabniskiRacun.Update();
          
          ponastavitevGesla.DatumSpremembe = DateTime.Now;
          ponastavitevGesla.IpSpremembe = IpSpremembe;
          ponastavitevGesla.Update();
        }
        return null;
      }
    }

  }
}
